<?php

/**
 * Zend Framework
 * LICENSE
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 * @category Zend
 * @package Zend_Db
 * @subpackage Profiler
 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license http://framework.zend.com/license/new-bsd New BSD License
 * @version $Id: Query.php 24593 2012-01-05 20:35:02Z matthew $
 */
/**
 *
 * @category Zend
 * @package Zend_Db
 * @subpackage Profiler
 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license http://framework.zend.com/license/new-bsd New BSD License
 */
class Zend_Db_Profiler_Query {

    /**
     * SQL query string or user comment, set by $query argument in constructor.
     * @var string
     */
    protected $_query = '';

    /**
     * One of the Zend_Db_Profiler constants for query type, set by $queryType argument in constructor.
     * @var integer
     */
    protected $_queryType = 0;

    /**
     * Unix timestamp with microseconds when instantiated.
     * @var float
     */
    protected $_startedMicrotime = null;

    /**
     * Unix timestamp with microseconds when self::queryEnd() was called.
     * @var integer
     */
    protected $_endedMicrotime = null;

    /**
     *
     * @var array
     */
    protected $_boundParams = array();

    /**
     *
     * @var array
     */
    /**
     * Class constructor.
     * A query is about to be started, save the query text ($query) and its
     * type (one of the Zend_Db_Profiler::* constants).
     * @param string $query
     * @param integer $queryType
     * @return void
     */
    public function __construct ($query, $queryType) {
        $this -> _query = $query;
        $this -> _queryType = $queryType;
        // by default, and for backward-compatibility, start the click ticking
        $this -> start ();
    }

    /**
     * Clone handler for the query object.
     * @return void
     */
    public function __clone () {
        $this -> _boundParams = array();
        $this -> _endedMicrotime = null;
        $this -> start ();
    }

    /**
     * Starts the elapsed time click ticking.
     * This can be called subsequent to object creation,
     * to restart the clock. For instance, this is useful
     * right before executing a prepared query.
     * @return void
     */
    public function start () {
        $this -> _startedMicrotime = microtime (true);
    }

    /**
     * Ends the query and records the time so that the elapsed time can be determined later.
     * @return void
     */
    public function end () {
        $this -> _endedMicrotime = microtime (true);
    }

    /**
     * Returns true if and only if the query has ended.
     * @return boolean
     */
    public function hasEnded () {
        return $this -> _endedMicrotime !== null;
    }

    /**
     * Get the original SQL text of the query.
     * @return string
     */
    public function getQuery () {
        return $this -> _query;
    }

    /**
     * Get the type of this query (one of the Zend_Db_Profiler::* constants)
     * @return integer
     */
    public function getQueryType () {
        return $this -> _queryType;
    }

    /**
     *
     * @param string $param
     * @param mixed $variable
     * @return void
     */
    public function bindParam ($param, $variable) {
        $this -> _boundParams[$param] = $variable;
    }

    /**
     *
     * @param array $param
     * @return void
     */
    public function bindParams (array $params) {
        if (array_key_exists (0, $params)) {
            array_unshift ($params, null);
            unset ($params[0]);
        }
        foreach ($params as $param => $value) {
            $this -> bindParam ($param, $value);
        }
    }

    /**
     *
     * @return array
     */
    public function getQueryParams () {
        return $this -> _boundParams;
    }

    /**
     * Get the elapsed time (in seconds) that the query ran.
     * If the query has not yet ended, false is returned.
     * @return float false
     */
    public function getElapsedSecs () {
        if (null === $this -> _endedMicrotime) {
            return false;
        }
        return $this -> _endedMicrotime - $this -> _startedMicrotime;
    }

    /**
     * Get the time (in seconds) when the profiler started running.
     * @return bool float
     */
    public function getStartedMicrotime () {
        if (null === $this -> _startedMicrotime) {
            return false;
        }
        return $this -> _startedMicrotime;
    }

}

